/** 
 *	@file	databasemonitor.h 
 *	@brief	описание класса для работы с базой данных. 
 * 
 *	описание класса и исключений для произведения операций над базой данных
 *	@date  18.07.2012
 *	@author  Kazakov A.V.
 */

#if !defined(_DATABASEMONITOR_H)
#define _DATABASEMONITOR_H

#include "searchparameter.h"
#include <list>
#include <QString>
#include <QObject>

/**	файл не существует	*/
const int	FILE_NOT_EXIST_EX	= 0xA1;	
/**	файл существует	*/
const int	FILE_EXIST			= 0xA2;
/**	не возможно создать базу данных	*/
const int	CANT_CREATE_DB_EX	= 0xA3;
/**	@macros CANT_OPEN_DATABASE	не возможно открыть базу данных	*/
const int	CANT_OPEN_DATABASE	= 0xA4;
/**	не возможно считать базу данных*/
const int	CANT_READ_DATABASE	= 0xA5;
/**	не возможно зависать базу данных	*/
const int	CANT_WRITE_DTBASE	= 0xA6;
/**	таблица существует	*/
const int	TABLE_EXIST			= 0xA7;
/**	ошибка запроса	*/
const int	QUERY_ERROR_EX		= 0xA8;
/**	карточка с данным id не существует	*/
const int CARD_NOT_EXIST_EX		= 0xA9;

class	QSqlDatabase;
class	LiteratureCard;

/**	@class DatabaseMonitor
 *	@brief	Класс для работы с базой данных.
 * 
 *	Производит работу с базой данных - запись, чтение, создание, 
 *				удаление <BR>
 *	<B>Пример:</B>
 *	@code
 *	try
 *	{
 *		DatabaseMonitor	dbMon;
 *		//	создание базы данных
 *		dbMon.createDataBase(QString("filename.db"));
 *	}
 *	catch(...)
 *	{
 *	}
 *	@endcode
 *	@note	используется в LibraryMonitor
 *	@author	Kazakov A.V.
 */
class DatabaseMonitor : public QObject
{
	Q_OBJECT
public:
	/**	конструктор
     *	@param	parent - родительский объект
	 */
	explicit DatabaseMonitor(QObject *parent = NULL);
	
	/**
     * деструктор
	 */
	virtual	~DatabaseMonitor();
	
    /**
	 *	Создать базу данных
	 *	@param qstrDataBaseName	имя файла базыданных
	 *	@return возвращает имя файла базы данных
     *	@exception	CANT_OPEN_DATABASE	- ошибка открытия базы данных
     *	@exception	CANT_CREATE_DB_EX	- ошибка создания таблицы
     *	@exception	QUERY_ERROR_EX		- ошибка запроса к базе данных
     *	@exception	CANT_WRITE_DTBASE	- ошибка записи базы данных
	 */
    QString createDataBase(QString qstrDataBaseName);
    
    /**
     *	указать файл базы данных и подключиться к ней
     *	@param qstrDataBaseFileName имя/адрес файла базы данных
     *	@exception	FILE_NOT_EXIST_EX - файл не существует
     *	@exception	CANT_OPEN_DATABASE - невозможно открыть базу данных
     */
    void setDataBaseFileName(QString qstrDataBaseFileName);

    /**
     *	дай карточку с номером
     *	@param id номер карточки в базе данных
     *	@return возвращает информационную карточку литературы
	 *	@exception	CANT_OPEN_DATABASE
	 *	@exception	QUERY_ERROR_EX
	 *	@exception	CANT_READ_DATABASE
     */
    LiteratureCard getCard(int id);
    
    /**
     *	записать карточку в базу данных
     *	@param card информационная карточка литературы
     *	@return true в случае успешной записи карточки в базу данных
	 *	@exception	CANT_OPEN_DATABASE
	 *	@exception	CANT_WRITE_DTBASE
     */
    bool writeCard(LiteratureCard card);

    /**
     * обновить данные по литературной карточке
     * @param card литературная карточка источника
     * @return true в случае успеха
     * @exception CANT_OPEN_DATABASE	- невозможно открыть базу данных
     * @exception CANT_WRITE_DTBASE		- невозможно записать в базу данных
     */
    bool updateCard(LiteratureCard card);

    /**
     *	поиск информации в базе данных по определенному параметру
     *	@param sp параметр поиска
     *	@param card информационная карта с одним заполненым полем для поиска
     *	@return возвращает список отобранных по параметру информационных карт
	 *	@exception	CANT_OPEN_DATABASE
	 *	@exception	CANT_READ_DATABASE
     */
    std::list<LiteratureCard> search(SearchParameter sp, LiteratureCard card);

    /**
     *	Удаляет таблицу из базы данных
	 *	@return	<b>true</b>		в случае успешного удаления
	 *	@return	<b>false</b>	в случае отказа пользователя
	 *	@exception	QUERY_ERROR_EX		- ошибка запроса к базе данных
	 *	@exception	CANT_OPEN_DATABASE	- ошибка открытия
     */
    bool deleteTable();
private:
	/**	
	 *	путь к файлу с базой данных	
	 */
    QString	qstrFileName;	

    /**	
	 *	база данных
	 */
	QSqlDatabase	*LiteratureBase;

private:
    /**
     * открыть соединение с базой данных
     * @return true если соединение открыто
     */
	bool openDataBase();

    /**
     * закрыть соединение с базой данных
     * @return true если соединение закрыто
     */
	bool closeDataBase();
};

#endif  //_DATABASEMONITOR_H
